#ifndef DockAreaTitleBarH
#define DockAreaTitleBarH
/*******************************************************************************
** Qt Advanced Docking System
** Copyright (C) 2017 Uwe Kindler
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/


//============================================================================
/// \file   DockAreaTitleBar.h
/// \author Uwe Kindler
/// \date   12.10.2018
/// \brief  Declaration of CDockAreaTitleBar class
//============================================================================


//============================================================================
//                                   INCLUDES
//============================================================================
#include <QToolButton>
#include <QFrame>

#include "ads_globals.h"

QT_FORWARD_DECLARE_CLASS(QAbstractButton)

namespace ads
{
class CDockAreaTabBar;
class CDockAreaWidget;
struct DockAreaTitleBarPrivate;
class CElidingLabel;

using tTitleBarButton = QToolButton;

/**
* Title bar button of a dock area that customizes tTitleBarButton appearance/behaviour
* according to various config flags such as:
* CDockManager::DockAreaHas_xxx_Button - if set to 'false' keeps the button always invisible
* CDockManager::DockAreaHideDisabledButtons - if set to 'true' hides button when it is disabled
*/
class CTitleBarButton : public tTitleBarButton
{
	Q_OBJECT

// 以下是对代码进行了优化和添加了注释的版本

private:
    bool ShowInTitleBar = true; // 是否在标题栏中显示按钮
    bool HideWhenDisabled = false; // 当按钮被禁用时是否隐藏

public:
    using Super = tTitleBarButton; // 基类类型别名

    CTitleBarButton(bool ShowInTitleBar = true, QWidget* parent = nullptr); // 构造函数

    /**
     * 根据内部设置调整可见性变化请求
     */
    virtual void setVisible(bool visible) override;

    /**
     * 配置是否在标题栏中显示标题栏按钮
     */
    void setShowInTitleBar(bool Show);

protected:
    /**
     * 处理EnabledChanged信号，如果配置为不可见，则设置按钮不可见
     */
    bool event(QEvent *ev) override;
};

/**
 * Dock区域的标题栏
 * 标题栏包含一个带有所有Dock窗口组的选项卡栏，以及选项卡菜单按钮、取消停靠按钮和关闭按钮。
 */
class ADS_EXPORT CDockAreaTitleBar : public QFrame
{
    Q_OBJECT
private:
    DockAreaTitleBarPrivate* d; // 私有数据 (pimpl)
    friend struct DockAreaTitleBarPrivate;

private Q_SLOTS:
    void onTabsMenuAboutToShow(); // 选项卡菜单即将显示时的槽函数
    void onCloseButtonClicked(); // 关闭按钮点击时的槽函数
    void onUndockButtonClicked(); // 取消停靠按钮点击时的槽函数
    void onTabsMenuActionTriggered(QAction* Action); // 选项卡菜单动作触发时的槽函数
    void onCurrentTabChanged(int Index); // 当前选项卡更改时的槽函数
    void onAutoHideButtonClicked(); // 自动隐藏按钮点击时的槽函数
    void onAutoHideDockAreaActionClicked(); // 自动隐藏停靠区域动作点击时的槽函数
    void onAutoHideToActionClicked(); // 自动隐藏到动作点击时的槽函数

protected:
    /**
     * 存储鼠标位置以检测拖动
     */
    virtual void mousePressEvent(QMouseEvent* ev) override;

    /**
     * 存储鼠标位置以检测拖动
     */
    virtual void mouseReleaseEvent(QMouseEvent* ev) override;

    /**
     * 如果不是浮动窗口中的最后一个停靠区域，则开始浮动整个停靠区域，包括所有的Dock窗口
     */
    virtual void mouseMoveEvent(QMouseEvent* ev) override;

    /**
     * 双击标题栏也会开始浮动整个区域
     */
    virtual void mouseDoubleClickEvent(QMouseEvent *event) override;

    /**
     * 显示上下文菜单
     */
    virtual void contextMenuEvent(QContextMenuEvent *event) override;

public Q_SLOTS:
    /**
     * 调用此槽函数告诉标题栏下次显示时应更新选项卡菜单
     */
    void markTabsMenuOutdated();

public:
    using Super = QFrame; // 基类类型别名

    /**
     * 默认构造函数
     */
    CDockAreaTitleBar(CDockAreaWidget* parent);

    /**
     * 虚析构函数
     */
    virtual ~CDockAreaTitleBar();

    /**
     * 返回指向tabBar()的指针
     */
    CDockAreaTabBar* tabBar() const;

    /**
     * 返回与给定标题栏按钮标识符对应的按钮
     */
    CTitleBarButton* button(TitleBarButton which) const;

    /**
     * 返回自动隐藏标题标签，在扩展并自动隐藏停靠区域时使用
     */
    CElidingLabel* autoHideTitleLabel() const;

    /**
     * 更新标题栏中的Dock窗口动作按钮的可见性
     */
    void updateDockWidgetActionsButtons();

    /**
     * 在调用基类实现之前将选项卡菜单标记为过时
     */
    virtual void setVisible(bool Visible) override;

    /**
     * 在此标题栏中插入自定义小部件到位置索引
     * 如果索引为负数，则在末尾添加小部件
     * 可以使用此函数在标题栏中插入自定义小部件
     */
    void insertWidget(int index, QWidget *widget);

    /**
     * 在此标题栏中查找小部件widget
     * 可以使用此函数获取默认小部件在标题栏中的位置
     * \code
     * int tabBarIndex = TitleBar->indexOf(TitleBar->tabBar());
     * int closeButtonIndex = TitleBar->indexOf(TitleBar->button(TitleBarButtonClose));
     * \endcode
     */
    int indexOf(QWidget *widget) const;

    /**
     * 根据当前状态关闭组工具提示
     * 自动隐藏小部件只能有一个Dock窗口，因此在工具提示中显示关闭组没有意义
     */
    QString titleBarButtonToolTip(TitleBarButton Button) const;

    /**
     * 如果区域的DockWidgetFloatable标志为true，则将停靠区域移动到自己的浮动窗口中
     */
    void setAreaFloating();

Q_SIGNALS:
    /**
     * 当用户点击选项卡栏中的选项卡或标题栏选项卡菜单中的选项卡项时，发出此信号
     */
    void tabBarClicked(int index);
}; // 类名

}
 // namespace ads
//-----------------------------------------------------------------------------
#endif // DockAreaTitleBarH
